﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Bukstor.Biz;
using System.Text;
using System.IO;



namespace Bukstor.Admin.UI
{
    public partial class Titulos : System.Web.UI.Page
    {
        
        //#region Propiedades
        //    public int IdTitulo { get { return int.Parse(txtIdLibro.Text); } }
        //    public string ISBN { get { return txtIsbn.Text; } }
        //    public string Titulo { get { return txtTitulo.Text; } }
        //    public string Autor { get { return ddlAutores.Text; } }
        //    public string Editorial { get { return ddlEditorial.Text; } }
        //    public string PathTapa { get { return imgTapa.ImageUrl; } }
        //    public string Sinopsis { get { return txtSinopsis.Text; } }
        //    public string SubCategoria { get { return ddlSubcategorias.Text; } }
        //    public string Discontinuo { get { return ddlDiscontinuo.Text; } }
        //#endregion
        
        protected void Page_Load(object sender, EventArgs e)
        {
            ((Label)this.Master.FindControl("lblTitulo")).Text = "TITULOS";           
        }

        public List<LibrosConAutores> listarLibros()
        {
            BukstorBDEntities Entidad = new BukstorBDEntities();
            IEnumerable<Libro> LibrosAMostrar = from Libro L in Entidad.Libros
                                                select L;
            List<LibrosConAutores> librosTabla = new List<LibrosConAutores>();
            foreach (Libro L in LibrosAMostrar)
            {
                
                L.Autores.Load();
                L.EditorialReference.Load();
                L.SubcategoriaReference.Load();
                L.InventarioReference.Load();
                //Creo un libro de la clase LibroConAutores y le agrego las propiedades
                LibrosConAutores nuevolibro = new LibrosConAutores();
                nuevolibro.ID = L.id;
                nuevolibro.Titulo = L.titulo;
                //Le agrego los autores como en Tests.
                StringBuilder autoresDeEsteLibro = new StringBuilder();
                foreach (Autor A in L.Autores)
                {
                    if (autoresDeEsteLibro.Length != 0) autoresDeEsteLibro.Append(", ");
                    autoresDeEsteLibro.Append(A.apellido);
                }
                nuevolibro.Autor = autoresDeEsteLibro.ToString();
                nuevolibro.Isbn = L.isbn;
                nuevolibro.Editorial = L.Editorial.nombre;
                nuevolibro.Sinopsis = L.sinopsis;
                nuevolibro.Subcategoria = L.Subcategoria.nombre;
                nuevolibro.Discontinuo = L.discontinuo;
                nuevolibro.Precio = L.Inventario.precioUnitario;
                librosTabla.Add(nuevolibro);
            }            
            return librosTabla;
        }

        protected void GridView1_SelectedIndexChanged1(object sender, EventArgs e)
        {
            btnModificar.Enabled = true;
            BukstorBDEntities entidades = new BukstorBDEntities();
            GridViewRow filaTitulo = GridView1.SelectedRow;
            int idLibro = int.Parse(filaTitulo.Cells[1].Text);
            Libro libro = entidades.Libros.First(i => i.id == idLibro);
            if (!libro.Autores.IsLoaded) libro.Autores.Load();
            if (!libro.EditorialReference.IsLoaded) libro.EditorialReference.Load();

            hidIdLibro.Value = libro.id.ToString();
            cblAutores.ClearSelection();
            foreach (Autor autor in libro.Autores)
            {
                cblAutores.Items.FindByValue(autor.id.ToString()).Selected = true;
            }
            txtTitulo.Text = libro.titulo;
            txtIsbn.Text = filaTitulo.Cells[4].Text;
            ddlEditorial.SelectedValue = libro.Editorial.id.ToString();
            txtSinopsis.Text = HttpUtility.HtmlDecode(filaTitulo.Cells[6].Text);
            string subcategoria = HttpUtility.HtmlDecode(filaTitulo.Cells[7].Text);
            ddlSubcategorias.SelectedValue = entidades.Subcategorias.First(i => i.nombre == subcategoria).id.ToString();
            ddlDiscontinuo.Text = filaTitulo.Cells[8].Text;
            txtPrecio.Text = filaTitulo.Cells[9].Text;
            imgFoto.ImageUrl = "/Bukstor/images/tapas/" + (libro.tapa != null ? libro.tapa : "na.gif");
        }

        protected void btnAlta_OnClick(object sender, EventArgs e) 
        {
            
            BukstorBDEntities Entidad = new BukstorBDEntities();
            int idSelEditorial=-1;
            
            Libro nuevoLibro = Libro.CreateLibro(0, txtIsbn.Text,txtTitulo.Text,txtSinopsis.Text,true);
                        
            //averiguar el Editorial
            idSelEditorial = int.Parse(ddlEditorial.SelectedValue);
            nuevoLibro.Editorial = (from Editorial edit in Entidad.Editoriales
                                    where edit.id == idSelEditorial
                                    select edit).First();
            
            //averiguar la subcategoria
            int idSelSubcategoria = int.Parse(ddlSubcategorias.SelectedValue);
            nuevoLibro.Subcategoria = (from Subcategoria sub in Entidad.Subcategorias where sub.id == idSelSubcategoria select sub).First();
 
            //Averiguar autor
            foreach (ListItem item in cblAutores.Items)
            {
                if (item.Selected)
                {
                    int idSelAutor = int.Parse(item.Value);
                    Autor autor = (from Autor aut in Entidad.Autores where aut.id == idSelAutor select aut).First();
                    nuevoLibro.Autores.Add(autor);
                }
            }
            
            Entidad.AddToLibros(nuevoLibro);
            Entidad.Refresh(System.Data.Objects.RefreshMode.StoreWins, Entidad.Libros);
            int idUltimo=0;
            IEnumerable<Libro> ultimoLibro = from Libro L in Entidad.Libros                                              
                                             select L;
            foreach (Libro l in ultimoLibro)
            {
                if (l.id > idUltimo) { idUltimo = l.id; } 
            }
            //Creo un nuevo inventario            
            Inventario nuevoInventario = Inventario.CreateInventario(idUltimo+1, 0, 0, 0, decimal.Parse(txtPrecio.Text));
            
            //Agrego el nuevo inventario al libro                               
            Entidad.AddToInventarios(nuevoInventario);
            nuevoLibro.Inventario = nuevoInventario;
            Entidad.AddToLibros(nuevoLibro);
            Entidad.SaveChanges();
            reset();
        }

        protected void btnVerFoto_Click(object sender, EventArgs e)
        {
            //Guardar la foto
            string nombreArchivo = GuardarArchivo(fuTapa.PostedFile);
            //Ver la foto
            string ruta = Server.MapPath("/Bukstor/images/tapas");
            string pathFoto = "/Bukstor/images/tapas/" + nombreArchivo;
            imgFoto.ImageUrl = pathFoto;            
        }

        private string GuardarArchivo(HttpPostedFile file)
        {
            // Se carga la ruta física de la carpeta temp del sitio
            string ruta = Server.MapPath("/Bukstor/images/tapas/");
            string nombre, extension;
            extension = file.FileName.Substring(file.FileName.LastIndexOf('.') + 1);
            nombre = file.FileName.Replace('.' + extension, "");
            string archivo = String.Format(@"{0}\{1}", ruta, file.FileName);
            Random randomizer = new Random();

            // Verificar que el archivo no exista
            while (File.Exists(archivo))
            {
                nombre += randomizer.Next().ToString();
                archivo = String.Format(@"{0}\{1}.{2}", ruta, nombre, extension);
            }
            file.SaveAs(archivo);
            string nombreArchivoFinal=new StringBuilder(nombre).Append('.').Append(extension).ToString();
            hidTapa.Value = nombreArchivoFinal;
            return nombreArchivoFinal;
        }

        public List<AutoresNombreYApellido> traerAutores()
        {
            BukstorBDEntities Entidad = new BukstorBDEntities();
            IEnumerable<Autor> listaAutores = from Autor A in Entidad.Autores
                                              select A;
            List<AutoresNombreYApellido> listaNyA = new List<AutoresNombreYApellido>();
            foreach (Autor a in listaAutores)
            {
                AutoresNombreYApellido nuevoAutor = new AutoresNombreYApellido();
                nuevoAutor.IdAutor = a.id;
                nuevoAutor.NomresAutor = a.ToString();
                listaNyA.Add(nuevoAutor);
            }
            return listaNyA;
        }

        protected void btnModificar_Click(object sender, EventArgs e)
        {
            BukstorBDEntities entidades = new BukstorBDEntities();
            int idLibro = int.Parse(hidIdLibro.Value);
            Libro libro = entidades.Libros.First(i => i.id == idLibro);
            if (!libro.InventarioReference.IsLoaded) libro.InventarioReference.Load();
            if (!libro.Autores.IsLoaded) libro.Autores.Load();

            List<int> autoresNuevos = new List<int>();
            foreach (ListItem item in cblAutores.Items)
            {
                if (item.Selected)
                {
                    int idAutor = int.Parse(item.Value);
                    Autor a = entidades.Autores.First(i => i.id == idAutor);
                    libro.Autores.Add(a);
                    autoresNuevos.Add(idAutor);
                }
            }
            List<Autor> autoresAQuitar = new List<Autor>();
            foreach (Autor autor in libro.Autores)
            {
                
                if (!autoresNuevos.Contains(autor.id))
                {
                    autoresAQuitar.Add(autor);
                }
            }
            foreach (Autor autor in autoresAQuitar)
            {
                libro.Autores.Remove(autor);
            }

            libro.discontinuo = (ddlDiscontinuo.SelectedIndex == 0);

            int idEditorial = int.Parse(ddlEditorial.SelectedValue);
            libro.Editorial = entidades.Editoriales.First(i => i.id == idEditorial);

            libro.Inventario.precioUnitario = decimal.Parse(txtPrecio.Text);
            libro.isbn = txtIsbn.Text;
            libro.sinopsis = txtSinopsis.Text;

            int idSubcategoria=int.Parse(ddlSubcategorias.SelectedValue);
            libro.Subcategoria=entidades.Subcategorias.First(i=>i.id==idSubcategoria);

            GuardarArchivo();
            if (hidTapa.Value != "") libro.tapa = hidTapa.Value;
            libro.titulo = txtTitulo.Text;

            entidades.SaveChanges();
            btnModificar.Enabled = false;
            reset();
        }

        private void GuardarArchivo()
        {
            if (fuTapa.HasFile)
            {
                GuardarArchivo(fuTapa.PostedFile);
            }
        }

        private void reset()
        {
            // Blanquear controles
            GridView1.DataBind();
        }
    }
}

